<h1 class="entry-title entry-title-single" itemprop="headline">ABAP 开发系列(02): ABAP Development Workbench 介绍（下）- ABAP 调试器</h1>

 <div class="entry-content entry-content-single entry-content-aside" itemprop="text">
<h2><b>8. <span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/debugger" title="查看Debugger中的全部文章" target="_blank">Debugger</a></span> – <span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap-abap" title="ABAP" target="_blank">ABAP</a></span> 调试器</b></h2>
<p>开发程序，调试器是必不可少的工具，而<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap-abap" title="ABAP" target="_blank">ABAP</a></span>调试器与一般的IDE调试器也有些差异。</p>
<p>ABAP调试器的主要内容有：</p>
<p>1. 进入<span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/debugger" title="查看Debugger中的全部文章" target="_blank">Debugger</a></span>模式的方法；</p>
<p>2. Single Step/Execute/Return/Contiune 的用法；</p>
<p>3. Watchpoint 的使用方法；</p>
<p>4. 调试器的其他功能；</p>
<p><span id="more-87"></span></p>
<p>&nbsp;</p>
<h3>8.1  进入Debugger模式的方法</h3>
<h4>8.1.1  通过内部断点</h4>
<p>我们可以通过ABAP编辑器中工具栏 的会话断点按钮，</p>
<p><img class="alignnone size-full wp-image-75" alt="abap_1_ABAP_Editor_Toolbar_Debug" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_ABAP_Editor_Toolbar_Debug.png" width="565" height="33" /></p>
<p>将光标停在待调试的程序行后，点击设置断点按钮，然后直接执行，程序就会停在我们设置断点的位置：</p>
<p><img class="alignnone size-full wp-image-80" alt="abap_1_Debugger_Breakpoint" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Breakpoint.png" width="470" height="169" /></p>
<p>&nbsp;</p>
<p>提到内部断点，我们不得不说下另外一种断点 <b>外部断点</b>。</p>
<p>顾名思义，外部断点用于我们提供给外部接口时的程序调试断点</p>
<p>例如：Call RFC、Web Dynpro for Java。而且只限于Call RFC的公共用户，且只保持2个小时有效。</p>
<p>外部断点位于内部断点的右边，添加外部断点后，断点标志是以头像的形式出现：</p>
<p><img class="alignnone size-full wp-image-81" alt="abap_1_Debugger_ExternalBreakpoint" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_ExternalBreakpoint.png" width="462" height="166" /></p>
<p>激活调试后，当我们运行时，系统会新开一个调试会话窗口，也就是我们的调试界面：</p>
<p><img class="alignnone size-full wp-image-76" alt="abap_1_Debugger" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger.png" width="946" height="599" /></p>
<p>&nbsp;</p>
<p><span style="font-size: 1em; line-height: 1.5em;"> </span></p>
<h4><b>8.1.2  通过 ‘/h’ 命令（一般常用于生产环境）</b></h4>
<p>如果不想在程序里面去设置断点进行调试的话，我们进入程序运行初始屏幕后（输入T-Code后的屏幕界面），</p>
<p>在命令域里面输入 <b>‘/h’</b>, 来激活调试：</p>
<p><img class="alignnone size-full wp-image-77" alt="abap_1_Debugger_Active_h" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Active_h.png" width="310" height="28" /></p>
<p>当激活调试成功时，系统下边栏会弹出相关提示：</p>
<p><img class="alignnone size-full wp-image-79" alt="abap_1_Debugger_Active_Tip" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Active_Tip.png" width="172" height="32" /></p>
<p>这时当我们执行程序，则会进入到调试界面，只不过这里默认的断点位置是从程序的开头开始。</p>
<p>&nbsp;</p>
<h4><b>8.1.3  通过系统菜单</b></h4>
<p>在操作事务的屏幕界面上，也可以通过系统菜单（<b>系统 -&gt; 实用程序 -&gt; 调试ABAP</b>）激活调试：</p>
<p><img class="alignnone size-full wp-image-78" alt="abap_1_Debugger_Active_Menu" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Active_Menu.png" width="350" height="167" /></p>
<p>&nbsp;</p>
<h3><b>8.2 Single Step/Execute/Return/Continue </b><b>的用法</b></h3>
<p>调试界面工具栏上，我们可以看到这样几个工具按钮：</p>
<p><img class="alignnone size-full wp-image-82" alt="abap_1_Debugger_Toolbar" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Toolbar.png" width="317" height="33" /></p>
<p>从左到右分别是：</p>
<p>Single Step（单步执行/F5）、Execute（执行/F6）、Return（返回/F7）、Continue（继续执行/F8）、Watchpoint（创建查看点/ Shift+F4）、Layout（布局）</p>
<p>&nbsp;</p>
<h4><b>8.2.1  Single Step 用法</b></h4>
<p>Single Step 也是我们常说的单步调试（快捷键：F5），这种方式都是以单步跟踪调试每一条程序；</p>
<p>可以通过Single Step 来调试查看标准程序的操作。</p>
<p>&nbsp;</p>
<h4><b>8.2.2 Execute 用法</b></h4>
<p>执行调试（快捷键：F6），这种方式是调试中最常用的方式；</p>
<p>对我们当前屏幕上的程序进行跟踪，当遇到Subroutine或者<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/function" title="Function" target="_blank">Function</a></span>时，则会直接执行过去。</p>
<p>&nbsp;</p>
<h4>8.2.3 Return 用法</h4>
<p>返回（快捷键：F7），返回并退出当前程序块，也就是当我们进入到某个程序块（例如：Subroutine、<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/function" title="Function" target="_blank">Function</a></span>）时，</p>
<p>我们需要跟踪的信息已经确认完成了，想退出这个程序块，继续跟踪后面的程序，则可以通过Return方式，退出当前程序块。</p>
<p>&nbsp;</p>
<h4>8.2.4 Continue 用法</h4>
<p>继续执行（快捷键：F8），当我们进入断点并确认相关信息后，可以通过Continue（F8）直接运行程序到结束 或 者遇到下一个断点为止。</p>
<p>这也是一个常用的调试方式。</p>
<p>一般情况下，上面几种方式都会综合使用，以达到事半功倍的作用。</p>
<p>而在调试过程中，我们可以通过双击变量，然后，系统会帮我们将需要跟踪的变量、内表等信息内容显示在屏幕的右边界面：</p>
<p><img class="alignnone size-full wp-image-83" alt="abap_1_Debugger_Variable" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Variable.png" width="946" height="599" /></p>
<p>&nbsp;</p>
<h3>8.3 Watchpoint 的使用方法</h3>
<p>在调试过程中，当数据量很庞大，特别是在Loop中遍历时，需要找到其中特定跟踪的数据，这时候只能看着程序发懵。</p>
<p>为了解决这种困惑，<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap" title="SAP" target="_blank">SAP</a></span>为我们提供了 Watchpoint 功能。</p>
<p>在工具栏中，点击创建 Watchpoint按钮（Shift+F4），输入你要跟踪的变量名称，并在条件中输入符合的条件：</p>
<p><img class="alignnone size-full wp-image-84" alt="abap_1_Debugger_Watchpoint_Create" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Watchpoint_Create.png" width="822" height="404" /></p>
<p>注意：输入条件时，变量名称必须是大写的。</p>
<p>创建成功后，直接按F8（Continue方法），程序会继续执行并停在变量符合你输入条件的位置：</p>
<p><img class="alignnone size-full wp-image-85" alt="abap_1_Debugger_Watchpoint_Execute" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Watchpoint_Execute.png" width="1046" height="599" /></p>
<p>而且，当到达位置时，界面下边栏也会对变量给出提示：</p>
<p><img class="alignnone size-full wp-image-86" alt="abap_1_Debugger_Watchpoint_Execute_Tip" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Watchpoint_Execute_Tip.png" width="308" height="31" /></p>
<p>&nbsp;</p>
<h3>8.4. 调试器的其他功能</h3>
<h4>8.4.1 修改变量值</h4>
<p>在调试过程中，可以修改、删除变量值（包括内表），来节省调试时间。</p>
<p>双击待监控的变量，将其添加进监控区域后，再次双击该变量：</p>
<p><img class="alignnone size-full wp-image-100" alt="abap_1_Debugger_Edit_Variable_1" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Edit_Variable_1.png" width="442" height="340" /><br />
<img class="alignnone size-full wp-image-99" alt="abap_1_Debugger_Edit_Variable_2" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Edit_Variable_2.png" width="646" height="198" /></p>
<p>点击变量旁边的 “铅笔” ，进入到编辑状态：</p>
<p><img class="alignnone size-full wp-image-98" alt="abap_1_Debugger_Edit_Variable_3" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Edit_Variable_3.png" width="649" height="195" /></p>
<p>编辑你需要的值之后，敲回车即可。</p>
<p>内表的操作，则都是通过服务工具来完成，查看内表明细内容时，选中待修改或删除的记录行后，点击右边栏的“小锤子”：</p>
<p><img class="alignnone size-full wp-image-97" alt="abap_1_Debugger_Edit_Inner_Table_Detail" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Edit_Inner_Table_Detail.png" width="801" height="499" /></p>
<p>弹出操作框：</p>
<p><img class="alignnone size-full wp-image-96" alt="abap_1_Debugger_Edit_Inner_Table_Services" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Edit_Inner_Table_Services.png" width="502" height="470" /></p>
<p>在Change Table Content 菜单下，可选择操作：</p>
<ul>
<li>1. Change Row Content 修改内表行记录</li>
<li>2. Insert Row(Index) 插入新纪录</li>
<li>3. Append Row(APPEND) 追加新纪录</li>
<li>4. Delete Rows 删除选择行记录（可包括多条记录）</li>
<li>5. Delete Table (FREE) 删除释放整个内容记录</li>
</ul>
<p>选择相应的工具操作即可。</p>
<p>&nbsp;</p>
<h4>8.4.2 定位到光标指定位置</h4>
<p>调试过程中，如果不留意跳过你要跟踪的程序段，这时候就很纠结，可能需要重新跑一次程序，这样既浪费时间又浪费精力。</p>
<p>有个方法，可以避免这种情况：直接将光标定位在你调试过的程序，</p>
<p>然后在菜单栏上选择：<b>Debugger -&gt; Goto statement</b> 或者快捷键：<b>Shift + F12</b></p>
<p><img class="alignnone size-full wp-image-95" alt="abap_1_Debugger_Goto_statement" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Goto_statement.png" width="236" height="303" /></p>
<p>这样程序则会从当前位置：</p>
<p><img class="alignnone size-full wp-image-94" alt="abap_1_Debugger_Goto_statement_arrow_1" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Goto_statement_arrow_1.png" width="594" height="377" /></p>
<p>倒回到光标指定位置，这样就可以重新跟踪调试：</p>
<p><img class="alignnone size-full wp-image-93" alt="abap_1_Debugger_Goto_statement_arrow_2" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Goto_statement_arrow_2.png" width="594" height="377" /></p>
<p>需要注意的是：指定位置后，应将之前得到结果的变量值或内表清掉，否则会出现重复记录。</p>
<p>&nbsp;</p>
<h4>8.4.3 导出内表到Excel文件</h4>
<p>调试过程中，从数据库中取出的数据量非常庞大，在内表中要找到我们待跟踪的记录，会非常麻烦。</p>
<p>解决办法就是：将整个内表数据导出到Excel文件。</p>
<p>在内表维护工具中，找到Save to Local File，然后选择保存成 .xls 格式即可：</p>
<p><img class="alignnone size-full wp-image-92" alt="abap_1_Debugger_Edit_Inner_Table_Services_Export_XLS" src="http://www.sapjx.com/wp-content/uploads/2014/01/abap_1_Debugger_Edit_Inner_Table_Services_Export_XLS.png" width="502" height="473" /></p>
<p>&nbsp;</p>